/*
一块岛上共有 n 块土地，每块土地都可以视为平面直角坐标系的一块矩形区域，由左下标(x1 , y1)和右上标(x2, y2)唯一确定。
且满足 x1 <= x2 且 y1 <= y2。
这 n 块土地中皆无重叠，只有边界有重叠。
最近，由于需要开辟一块新的土地，是一个a * b 的矩形区域，且左下角坐标为(0 , 0),右上角坐标为(a, b)。
计算开辟土地里已经存在的土地面积。
输入：
输入 n + 1 行，第 1 行包含两个整数 n, a, b，表示右上角岛的土地数量和新开辟土地的右上角坐标。
以下 n 行，每行包含四个整数 x1, y1, x2, y2，表示第 i 块土地的左下角坐标和右上角坐标。
输出：
输出一个整数，表示开辟土地里已经存在的土地面积。
*/

#include <iostream>// 用于输入输出
#include <vector>// 用于存储地块信息
#include <algorithm>// 用于排序
#include <thread>// 用于多线程
#include <mutex>// 用于保护共享数据

std::mutex mtx; // 互斥锁，用于保护共享数据

// 计算两个矩形的重叠面积
int calculateOverlapArea(int x1, int y1, int x2, int y2, int boundaryX, int boundaryY) {
    // 计算重叠区域边界
    int left = std::max(0, x1);
    int bottom = std::max(0, y1);
    int right = std::min(boundaryX, x2);
    int top = std::min(boundaryY, y2);

    // 检查是否有重叠
    if (left < right && bottom < top) {
        return (right - left) * (top - bottom);  // 返回重叠面积
    }

    return 0;  // 无重叠返回0
}

// 计算每块土地的重叠面积并累加
void calculateAreaSegment(const std::vector<std::tuple<int, int, int, int>>& plots, 
                           int boundaryX, int boundaryY, int start, int end, int& totalOverlappingArea) {
    for (int i = start; i < end; ++i) {
        int x1 = std::get<0>(plots[i]);// 左下角坐标
        int y1 = std::get<1>(plots[i]);
        int x2 = std::get<2>(plots[i]);
        int y2 = std::get<3>(plots[i]);

        // 计算重叠面积并累加
        int area = calculateOverlapArea(x1, y1, x2, y2, boundaryX, boundaryY);
        
        // 使用互斥锁保护共享数据
        mtx.lock();
        totalOverlappingArea += area;
        mtx.unlock();
    }
}

int main() {
    int n, a, b;
    std::cout << "请输入地块数量 n 和边界尺寸 a, b: ";
    std::cin >> n >> a >> b;  // 输入地块数量与边界尺寸

    if (n <= 0 || a <= 0 || b <= 0) {
        std::cerr << "错误: n, a, b 必须为正数！" << std::endl;
        return -1;  // 输入无效，返回错误码
    }

    std::vector<std::tuple<int, int, int, int>> plots(n);  // 存储地块信息

    // 批量输入土地坐标
    for (int i = 0; i < n; ++i) {
        int x1, y1, x2, y2;
        std::cout << "请输入第 " << i + 1 << " 块土地的坐标 (x1, y1, x2, y2): ";
        std::cin >> x1 >> y1 >> x2 >> y2;

        if (x1 >= x2 || y1 >= y2) {
            std::cerr << "错误: 输入的坐标必须保证 (x1 < x2) 且 (y1 < y2)！" << std::endl;
            return 1;  // 输入无效，返回错误码
        }

        plots[i] = std::make_tuple(x1, y1, x2, y2);
    }

    int totalOverlappingArea = 0;  // 总重叠面积

    // 使用多线程计算重叠面积
    int numThreads = std::thread::hardware_concurrency();  // 获取可用线程数
    std::vector<std::thread> threads;
    int segmentSize = n / numThreads;

    for (int i = 0; i < numThreads; ++i) {
        int start = i * segmentSize;
        int end = (i == numThreads - 1) ? n : (i + 1) * segmentSize;  // 确保最后一个线程处理剩余部分
        threads.emplace_back(calculateAreaSegment, std::cref(plots), a, b, start, end, std::ref(totalOverlappingArea));
    }

    for (auto& t : threads) {
        t.join();  // 等待所有线程完成
    }

    std::cout << "总重叠面积为: " << totalOverlappingArea << std::endl;  // 输出总重叠面积

    return 0;
}
